package com.youlv.yl.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.youlv.yl.dao.CartDao;
import com.youlv.yl.dto.CartNumDto;
import com.youlv.yl.dto.HotelCartDto;
import com.youlv.yl.entity.hotel.Cart;
import com.youlv.yl.entity.hotel.HotelCartItem;
import com.youlv.yl.dao.HotelCartItemDao;
import com.youlv.yl.service.intf.HotelCartItemService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.youlv.yl.util.StringUtils;
import com.youlv.yl.util.TokenUtils;
import com.youlv.yl.vo.R;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Arrays;
import java.util.Date;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author fenghe
 * @since 2022-01-19
 */
@Service
public class HotelCartItemServiceImpl extends ServiceImpl<HotelCartItemDao, HotelCartItem> implements HotelCartItemService {
    @Autowired
    private HotelCartItemDao dao;
    @Autowired
    private CartDao cartDao;

    /** 添加到购物车*/
    @Override
    public R addCart(HotelCartDto dto) {
        // 入参验证
        if(dto != null && dto.getNum() > 0) {
            // 判断是否为第一次添加
            // 获取token，
            String token = dto.getToken();
            // 通过token获取用户id
            Long uid = TokenUtils.getUidByToken(token);
            Long cid = getCidByUid(uid);
            QueryWrapper<HotelCartItem> queryWrapper1 = new QueryWrapper<>();
            queryWrapper1.eq("cid", cid).eq("hotelId", dto.getHotelId()).eq("houseType", dto.getHouseType());
            HotelCartItem item = dao.selectOne(queryWrapper1);
            if(item != null) {
                // 不是第一次添加，本次添加为修改
                UpdateWrapper<HotelCartItem> updateWrapper = new UpdateWrapper<>();
                updateWrapper.eq("cid", cid).eq("hotelId", dto.getHotelId()).eq("houseType", dto.getHouseType()).set("num", item.getNum() + 1);
                if(dao.update(null, updateWrapper) > 0) {
                    return R.ok();
                }
                return R.fail("亲，网络异常，请稍后重试哦！！！");
            } else {
                // 第一次添加，
                // 创建购物车列表
                HotelCartItem hotelcartItem = new HotelCartItem();
                hotelcartItem.setHotelId(dto.getHotelId());
                hotelcartItem.setHouseType(dto.getHouseType());
                hotelcartItem.setJoinPrice(dto.getJoinPrice());
                hotelcartItem.setNum(1);
                hotelcartItem.setCtime(new Date());
                // 将购物车id存入购物车列表
                hotelcartItem.setCid(cid);
                // 存入数据库
                System.err.println(hotelcartItem);
                if(dao.insert(hotelcartItem) > 0) {
                    System.out.println(hotelcartItem.getId());
                    return R.ok();
                }
                return R.fail("亲，网络异常，请稍后重试哦！！！");
            }
        }
        return R.fail("请传入正确的参数哦！！！");
    }

    /** 查询购物车*/
    @Override
    public R queryAll(String token) {
        // 入参校验
        if(token.length() > 0) {
            // 获取uid
            Long uid = TokenUtils.getUidByToken(token);
            // 通过uid获取cid
            Long cid = getCidByUid(uid);
            // 查询我的购物车
            System.out.println(cid);
            System.out.println(dao.queryCart(cid));
            return R.ok(dao.queryCart(cid));
        }
        return R.fail("请传入正确的参数哦！！！");
    }

    @Override
    public R queryIds(long[] ids) {
        System.out.println(Arrays.toString(ids));
        if(ids != null && ids.length > 0){
            System.out.println(dao.selectByIds(ids));
            return R.ok(dao.selectByIds(ids));
        }
        return R.fail("请检查参数信息！");
    }

    /** 修改购物车数量*/
    @Override
    public R change(CartNumDto dto) {
        // 入参校验
        if(dto != null && dto.getId() > 0 && dto.getNum() > 0) {
            // 创建构造器
            UpdateWrapper<HotelCartItem> updateWrapper = new UpdateWrapper<>();
            updateWrapper.eq("id", dto.getId()).set("num", dto.getNum());
            if(dao.update(null, updateWrapper) > 0) {
                return R.ok();
            }
            R.fail("网络异常，请稍后重试！！！");
        }
        return R.fail("请正确传入参数哦！！！");
    }

    /** 删除购物车*/
    @Override
    public R del(Long id) {
        // 入参验证
        if (id > 0) {
            if(dao.deleteById(id) > 0) {
                return R.ok();
            }
            R.fail("网络异常，请稍后重试！！！");
        }
        return R.fail("请正确传入参数哦！！！");
    }

    public Long getCidByUid(Long uid) {
        // 通过用户id获取购物车id
        QueryWrapper<Cart> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("uid", uid);
        Cart cart = cartDao.selectOne(queryWrapper);
        return cart.getId();
    }
}
